Skip to content

2.5.3: keep Panorama displays on USB and create runtime directories owner-only - #34

Merged
DXVSI merged 4 commits into
developmentfrom
fix/private-runtime-directories
Oct 7, 2026
Merged

DXVSI merged 4 commits into
developmentfrom
fix/private-runtime-directories

Conversation

@DXVSI

@DXVSI DXVSI commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Fixes for 2.5.3.

#28, Panorama-family displays dropping off USB. The runtime armed the bulk IN only around each request, so the link sat idle between keepalives, the condition that drops these displays until a power-off. For 391a:1011, 391a:1021 and 391a:1031 the runtime now keeps one bulk IN pending between requests, as the official bridge does. Between requests libusb's poll descriptors are serviced from the session thread's event loop, so an IN that ends is re-armed at once after data, or after 20 ms doubling to 200 ms when it ends without data. Idle completions never count toward the persistent-failure limit. A reporter with the drops ran the display for hours without a disconnect after a full power-off.

#32, display session never starting after the first media upload. QDir::mkpath() created the runtime's data and cache directories with the process umask, so a 0002 umask made them group-writable and the stores' safety checks rejected them on the next start. A rejected retry-cache root blocks the display session, while the status claimed that validation was still running. Directories the runtime creates now get 0700 for every missing component; existing ones are untouched and the checks are unchanged. Rejections now name the directory, its owner or mode and the chmod go-w command, and the session status says that the session cannot start.

The last commit bumps the version to 2.5.3 in every changelog, the AppStream metadata, the man pages and the README.

Checks: 977 native tests, the Flatpak protocol subset, the release contract and AppStream validation. The runtime ran on a Panorama SE with both changes.

Panorama, Panorama SE and Panorama WB displays on AMD 800-series chipset
controllers vanish from the bus during a session and return only after the
power supply is switched off. Testers traced it to the idle link between
exchanges: the official bridge keeps a bulk IN pending almost all the time
and survives for days, while a client that arms the IN only around each
request died within minutes and survived hours once it kept the IN pending.
This runtime armed the IN only around requests as well.

Add a keepBulkInPending product profile flag, enabled for the Panorama
family, and leave the IN pending after every exchange. An idle IN that the
firmware ends with an error or an empty packet is logged as
tryx_usb_idle_input, never counts toward the persistent input failure that
ends the session, and is re-armed only after the next request. Turris keeps
the request-scoped IN until there is data for it. Document the change and
the usbcore quirk workaround in the README.
Between requests no transport call serviced libusb, so an idle IN that the
firmware ended stayed unnoticed until the next request, and an idle IN
error suppressed the re-arm until then. With a 2 s keepalive the link could
stay idle for up to 2 s, the condition that drops Panorama-family displays.

Sessions that keep the IN pending now hand libusb's poll descriptors to the
owning thread's event loop, service completions as soon as they are ready,
and re-arm the IN right after data or after a short backoff (20 ms doubling
to 200 ms) when it ended without data. Data that arrives between requests is
queued and the IN re-armed at once.

Reported in review by @groovg on #28.
QDir::mkpath() creates directories with 0777 minus the process umask. With
the 0002 umask common on Ubuntu and Mint desktops, the shared data root, its
media-catalog and the prepared-media retry-cache root became group-writable,
and the stores' own safety checks then rejected them on the next start. A
rejected retry-cache root keeps the PASE display session from starting at
all, while the status claimed that stored retry media was still being
validated.

Directories the runtime creates for itself now get 0700 for every missing
component. Existing directories are left as they are and the safety checks
are unchanged. When a check rejects a directory, the warning names it with
its owner or mode and the chmod command that fixes the common case, and the
session status says that the display session cannot start instead of
describing a wait.

Reported in #32.
The release keeps Panorama-family displays on USB by holding a bulk IN
pending between requests, and creates the runtime's directories owner-only
so a 0002 umask no longer blocks the display session. Add the 2.5.3 entries
to every changelog and the AppStream metadata, point the README install
commands at the new package names, and describe the fix for directories
created by earlier versions.
@DXVSI
DXVSI merged commit e2cdc06 into development Oct 7, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant